package ar.edu.utn.frgp.banco.business.Implements;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import ar.edu.utn.frgp.banco.business.Interfaces.IntListadosBussines;
import ar.edu.utn.frgp.banco.dao.Implements.ImpClientes;
import ar.edu.utn.frgp.banco.dao.Implements.ImpPagoPrestamo;
import ar.edu.utn.frgp.banco.dao.connection.ImpConectionHandler;
import ar.edu.utn.frgp.banco.domain.Cliente;
import ar.edu.utn.frgp.banco.domain.ListMovimientos;
import ar.edu.utn.frgp.banco.domain.ListPlazosFijos;
import ar.edu.utn.frgp.banco.domain.ListPrestamos;
import ar.edu.utn.frgp.banco.domain.PagoPrestamo;
import ar.edu.utn.frgp.banco.domain.PlazoFijo;
import ar.edu.utn.frgp.banco.exceptions.DataAccessException;

public class ImpListadosBussines implements IntListadosBussines {

	@Override
	public List<ListMovimientos> ListaMovimientos(Integer id_cliente,
			Integer cantmov) throws Exception {
		try {

			// Valido Cliente
			Cliente cliente = new Cliente();
			ImpClientes clientedao = new ImpClientes();
			cliente = clientedao.ObtenerCliente(id_cliente);
			if (cliente == null) {
				throw new Exception("El cliente es inexsistente.");
			}

			PreparedStatement ps = null;
			ResultSet rs = null;
			List<ListMovimientos> listmovimientos = new ArrayList<ListMovimientos>();

			ImpConectionHandler handler = new ImpConectionHandler();
			Connection cn = handler.getConnection();

			try {
				StringBuilder stringBuilder = new StringBuilder();
				stringBuilder.append("select c.nrocuenta, c.tipocuenta, m.tipomov, ");
				stringBuilder.append("m.fecha, m.origen, m.monto, m.saldo ");
				stringBuilder.append(" from movimientos m ");
				stringBuilder.append("left join cuentas c ");
				stringBuilder.append("on m.id_cuenta = c.id_cuenta ");
				stringBuilder.append("where c.id_cliente = ? and rownum <= ? ");
				stringBuilder
						.append("order by m.fecha, c.id_cuenta, m.id_movimiento ");

				ps = cn.prepareStatement(stringBuilder.toString());
				ps.setInt(1, id_cliente);
				ps.setInt(2, cantmov);

				rs = ps.executeQuery();
				ListMovimientos listmov = null;
				while (rs.next()) {
					listmov = new ListMovimientos();

					listmov.setFecha(rs.getDate("fecha"));
					listmov.setMonto(rs.getDouble("monto"));
					listmov.setNrocuenta(rs.getInt("nrocuenta"));
					listmov.setOrigen(rs.getString("origen"));
					listmov.setSaldo(rs.getDouble("saldo"));
					listmov.setTipocuenta(rs.getString("tipocuenta"));
					listmov.setTipoMov(rs.getString("tipomov"));

					listmovimientos.add(listmov);
				}

			} catch (SQLException e) {
				throw new DataAccessException(e);
			} finally {
				handler.closeResources(rs, ps, cn);
			}
			return listmovimientos;

		} catch (Exception e) {
			throw new Exception(e.getMessage()); // ENVIO DE ECEPCIONES
		}

	}

	@Override
	public List<ListMovimientos> ListaDepExt(Integer id_cliente,
			String fec_desde, String fec_hasta) throws Exception {
		try {

			// Valido Cliente
			Cliente cliente = new Cliente();
			ImpClientes clientedao = new ImpClientes();
			cliente = clientedao.ObtenerCliente(id_cliente);
			if (cliente == null) {
				throw new Exception("El cliente es inexsistente.");
			}

			PreparedStatement ps = null;
			ResultSet rs = null;
			List<ListMovimientos> listmovimientos = new ArrayList<ListMovimientos>();

			ImpConectionHandler handler = new ImpConectionHandler();
			Connection cn = handler.getConnection();

			try {
				StringBuilder stringBuilder = new StringBuilder();
				stringBuilder.append("select c.nrocuenta, c.tipocuenta, m.tipomov, ");
				stringBuilder.append("m.fecha, m.origen, m.monto, m.saldo ");
				stringBuilder.append(" from movimientos m ");
				stringBuilder.append("left join cuentas c ");
				stringBuilder.append("on m.id_cuenta = c.id_cuenta ");
				stringBuilder.append("where c.id_cliente = ?  ");
				stringBuilder.append("and  m.origen = ? ");
				stringBuilder.append("and  m.fecha between ? and ? ");
				stringBuilder.append("order by m.fecha, c.id_cuenta, m.id_movimiento ");

				ps = cn.prepareStatement(stringBuilder.toString());
				ps.setInt(1, id_cliente);
				ps.setString(2, "CAJA");
				ps.setString(3, fec_desde);
				ps.setString(4, fec_hasta);

				rs = ps.executeQuery();
				ListMovimientos listmov = null;
				while (rs.next()) {
					listmov = new ListMovimientos();

					listmov.setFecha(rs.getDate("fecha"));
					listmov.setMonto(rs.getDouble("monto"));
					listmov.setNrocuenta(rs.getInt("nrocuenta"));
					listmov.setOrigen(rs.getString("origen"));
					listmov.setSaldo(rs.getDouble("saldo"));
					listmov.setTipocuenta(rs.getString("tipocuenta"));
					listmov.setTipoMov(rs.getString("tipomov"));

					listmovimientos.add(listmov);
				}

			} catch (SQLException e) {
				throw new DataAccessException(e);
			} finally {
				handler.closeResources(rs, ps, cn);
			}
			return listmovimientos;

		} catch (Exception e) {
			throw new Exception(e.getMessage()); // ENVIO DE ECEPCIONES
		}
	}

	@Override
	public List<ListPlazosFijos> ListaPlazosFijos(Integer id_cliente)
			throws DataAccessException {

		PreparedStatement ps = null;
		ResultSet rs = null;
		List<ListPlazosFijos> listplazosfijos = new ArrayList<ListPlazosFijos>();

		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();

		try {
			StringBuilder stringBuilder = new StringBuilder();

			stringBuilder.append("Select pl.id_plazofijo, pl.fechaalta, pl.fechavencimiento, ");
			stringBuilder.append("pl.origen, cu1.nrocuenta as cuenta_origen,  ");
			stringBuilder.append("cu1.tipocuenta as tipocuentaorigen, ");
			stringBuilder.append("pl.acreditacion, cu2.nrocuenta as cuenta_destino, ");
			stringBuilder.append("cu2.tipocuenta as tipocuentadestino, ");
			stringBuilder.append("pl.interes, pl.monto  ");
			stringBuilder.append("from plazosfijos pl ");
			stringBuilder.append("left join cuentas cu1 ");
			stringBuilder.append("on cu1.id_cuenta = pl.id_cuenta_origen ");
			stringBuilder.append("left join cuentas cu2  ");
			stringBuilder.append("on cu2.id_cuenta = pl.id_cuenta_destino ");
			stringBuilder.append("WHERE id_cliente = ? ");
			stringBuilder.append("order by pl.fechaalta, cu1.nrocuenta ");

			ps = cn.prepareStatement(stringBuilder.toString());
			ps.setInt(1, id_cliente);

			rs = ps.executeQuery();
			ListPlazosFijos listplafi = new ListPlazosFijos();
			while (rs.next()) {
				listplafi = new ListPlazosFijos();

				listplafi.setAcreditacion(rs.getString("acreditacion"));
				listplafi.setFechaAlta(rs.getDate("fechaalta"));
				listplafi.setFechaVenc(rs.getDate("fechavencimiento"));
				listplafi.setId_plazofijo(rs.getInt("id_plazofijo"));
				listplafi.setInteres(rs.getDouble("interes"));
				listplafi.setMonto(rs.getDouble("monto"));
				listplafi.setNrocuentadestino(rs.getInt("cuenta_destino"));
				listplafi.setNrocuentaorigen(rs.getInt("cuenta_origen"));
				listplafi.setOrigen(rs.getString("origen"));
				listplafi.setTipocuentadestino(rs.getString("tipocuentadestino"));
				listplafi.setTipocuentaorigen(rs.getString("tipocuentaorigen"));

				listplazosfijos.add(listplafi);

			}
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(rs, ps, cn);
		}
		return listplazosfijos;

	}

	@Override
	public List<ListPrestamos> LIstaPrestamos(Integer id_cliente)
			throws Exception {
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<ListPrestamos> listprestamos = new ArrayList<ListPrestamos>();
		ImpPagoPrestamo pagoprestamodao = new ImpPagoPrestamo();
		PagoPrestamo pagoprestamo = null;
		
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();

		try {
			StringBuilder stringBuilder = new StringBuilder();

			stringBuilder.append("select pr.id_prestamo, pr.fechaalta, pr.cantcuotas, ");
			stringBuilder.append("pr.monto, pr.interes*100 as interes,  ");
			stringBuilder.append("round((pr.monto*(pr.interes+1))/pr.cantcuotas,2) as montocuota, ");
			stringBuilder.append("cu.nrocuenta, cu.tipocuenta  ");
			stringBuilder.append("from prestamos pr  ");
			stringBuilder.append("left join cuentas cu ");
			stringBuilder.append("on pr.id_cuenta = cu.id_cuenta ");
			stringBuilder.append("where pr.id_cliente = ? ");
			
			ps = cn.prepareStatement(stringBuilder.toString());
			ps.setInt(1, id_cliente);

			rs = ps.executeQuery();
			ListPrestamos listpre = null;
			while (rs.next()) {
				listpre = new ListPrestamos();
				
				listpre.setCantidadCuotas(rs.getInt("cantcuotas"));
				listpre.setFecha(rs.getDate("fechaalta"));
				listpre.setId_prestamo(rs.getInt("id_prestamo"));
				listpre.setInteres(rs.getDouble("interes"));
				listpre.setMonto(rs.getDouble("monto"));
				listpre.setMontocuota(rs.getDouble("montocuota"));
				listpre.setNrocuenta(rs.getInt("nrocuenta"));
				listpre.setTipocuenta(rs.getString("tipocuenta"));

				pagoprestamo = pagoprestamodao.TraeUltimoPagoPrestamos(listpre.getId_prestamo());
				if(pagoprestamo != null){
					listpre.setCuotaspagas(pagoprestamo.getNrocuota());
					listpre.setCuotasimpagas(listpre.getCantidadCuotas()-pagoprestamo.getNrocuota());
				}else{
					listpre.setCuotaspagas(0);
					listpre.setCuotasimpagas(listpre.getCantidadCuotas());
				}
					
				listprestamos.add(listpre);

			}
		} catch (Exception e) {
			throw new Exception(e.getMessage()); // ENVIO DE ECEPCIONES
		} finally {
			handler.closeResources(rs, ps, cn);
		}
		return listprestamos;
	}
}
